/*
 * DeviceHttpHandler.h
 *
 *  Created on: 2017年7月24日
 *      Author: terry
 */

#ifndef DEVICEHTTPHANDLER_H_
#define DEVICEHTTPHANDLER_H_

#include "HttpServer.h"
#include "json/json.h"
#include <vector>
#include "DeviceType.h"


typedef std::vector< RecordFile >	RecordFileArray;


class DeviceHttpHandler : public HttpHandler
{
public:
	DeviceHttpHandler();

	~DeviceHttpHandler();

	virtual int handleJsonApi(const mg_str& method, const mg_str& uri,
		const mg_str& query, const mg_str& body,
		std::string& json);

	/**
	* 上传结束
	* @param name	变量名称
	* @param filepath	文件路径
	*/
	virtual void handleUpload(const char* name, const std::string& filepath);

	/**
	* 处理文件
	* @param method	方法
	* @param uri		相对URI
	* @param query		查询字符串
	* @param body		消息体
	* @param resp		响应的消息体
	* @param mime		响应的MIME类型
	* @return	HTTP状态码, 如果=0 则表示 200, < 0 表示 500
	*/
	virtual int handleFileApi(const mg_str& method, const mg_str& uri,
		const mg_str& query, const mg_str& body,
		std::string& resp, std::string& mime);

	/**
	* 处理 WebSocket 帧
	* @param data	帧数据
	* @param size	数据长度
	* @param flags 标志
	*/
	virtual void handleWebSocketFrame(unsigned char *data, size_t size, unsigned char flags);

	/// 获取告警上报URL 
	std::string getReportUrl();

	void setRecordDir(const std::string& dir, const std::string& url);

protected:
	virtual int deviceLogin(const std::string& cameraNo, const std::string& report);
	virtual int setVideoBitStream(const std::string& cameraNo, int stream, int resolution, int framerate, int bitrate);
	virtual int setHue(const std::string& cameraNo, int hue);
	virtual int setSaturation(const std::string& cameraNo, int saturation);
	virtual int setContrast(const std::string& cameraNo, int contrast);
	virtual int setBrightness(const std::string& cameraNo, int brightness);
	virtual int setOsdInfo(const std::string& cameraNo, const std::string& osdstr, int displayLocation);
	virtual int setWifiInfo(const std::string& cameraNo, const std::string& ssid, int type, const std::string& password);
	virtual int enableMute(const std::string& cameraNo, bool muted);
	virtual int updateDev(const std::string& cameraNo, const std::string& updateUrl, const std::string& newVersion);
	virtual int getBatteryInfo(const std::string& cameraNo, int& percent);
	virtual int getDevInfo(const std::string& cameraNo, std::string& version, float& totalSpace, float& freeSpace, int& state);
	virtual int getVideoBitStream(const std::string& cameraNo, int& stream, int& resolution, int& framerate, int& bitrate);
	virtual int getCameraInfo(const std::string& cameraNo, int& hue, int& saturation, int& contrast, int& brightness);
	virtual int getIsMute(const std::string& cameraNo);
	virtual int getDevUpdateInfo(const std::string& cameraNo, std::string& version);
	virtual int getFileList(const std::string& cameraNo, const std::string& startTime, const std::string& endTime, RecordFileArray& files);
	virtual int uploadFile(const std::string& cameraNo, const std::string& caseNumber,
		int viaNetwork, const std::string& uploadUrl, const std::string& fileNames);

	virtual int cameraReview(const std::string& cameraNo, std::string& url);

	virtual int startLive(const std::string& cameraNo, const std::string& caseNumber, const std::string& recordId, const std::string& liveProtocol,
			const std::string& pushUrl, int stream, const std::string& liveNoticeUrl);
	virtual int stopLive(const std::string& cameraNo);

	virtual int startRecord(const std::string& cameraNo, const std::string& caseNumber, const std::string& recordId);
	virtual int stopRecord(const std::string& cameraNo);

	virtual int startPhoto(const std::string& cameraNo, const std::string& recordId);
	virtual int endPhoto(const std::string& cameraNo, const std::string& recordId);

	virtual int recordReviewByVideo(const std::string& cameraNo, const std::string& videoName, std::string& rtspUrl);

protected:
	void setError(int code, const std::string& desc, std::string& jsonText);

	void setResult(const std::string& result, const std::string& desc, std::string& jsonText);
	void setResult(int result, const std::string& desc, std::string& jsonText);

	void setResult(int result, std::string& jsonText);
	void setResult(const std::string& result, std::string& jsonText);

	const char* getErrorDesc(int err);

protected:
	int handleDeviceLogin(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleSetVideoBitStream(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleSetHue(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleSetSaturation(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleSetContrast(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleSetBrightness(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleSetOsdInfo(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleSetWifiInfo(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleEnableMute(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleUpdateDev(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleGetBatteryInfo(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleGetDevInfo(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleGetVideoBitStream(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleGetCameraInfo(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleGetIsMute(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleGetDevUpdateInfo(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleGetFileList(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleUploadFile(const mg_str& query, const mg_str& body, std::string& jsonText);

	int handleCameraReview(const mg_str& query, const mg_str& body, std::string& jsonText);

	int handleStartLive(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleStopLive(const mg_str& query, const mg_str& body, std::string& jsonText);

	int handleStartRecord(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleStopRecord(const mg_str& query, const mg_str& body, std::string& jsonText);

	int handleStartPhoto(const mg_str& query, const mg_str& body, std::string& jsonText);
	int handleEndPhoto(const mg_str& query, const mg_str& body, std::string& jsonText);

	int handleRecordReviewByVideo(const mg_str& query, const mg_str& body, std::string& jsonText);

protected:
	std::string	m_reportUrl;

	std::string	m_recordDir;
	std::string	m_recordUrl;


};

#endif /* DEVICEHTTPHANDLER_H_ */
